﻿// See https://aka.ms/new-console-template for more information
//空对象模式
//空对象模式（Null Object Pattern）是一种行为型设计模式，它主要用于处理程序中出现的空对象引用。通常情况下，当我们需要使用一个对象时，我们会创建一个对象的实例并将其赋值给一个引用变量。但是，在某些情况下，对象可以不存在或不可用，这时就需要使用空对象模式。
//空对象模式的核心思想是：当对象为空时，返回一个预定义的空对象实例，这个实例具有与真正对象相同的接口，并且可以执行相同的操作，但是他的行为是无效的，不会产生任何实际的效果。
//空对象的主要优点是它可以消除null引用检查，并且可以避免在访问对象之前进行繁琐的null检查。另外，它还可以降低代码的复杂度，并且可以提高程序的可靠性和可维护性。

ILogger logger = null;

//从配置文件中获取日志文件名
string fileName = "log.txt";

//根据配置创建对象或空对象
if (string.IsNullOrEmpty(fileName))
{
    logger = new NullLogger();
}
else
{
    logger = new FileLogger(fileName);
}

//记录日志
logger.Log("记录日志");

Console.WriteLine("Hello, World!");

//抽象类或接口，定义了对象的行为
public interface ILogger
{
    void Log(string message);
}

//空对象类，实现了ILogger接口
public class NullLogger : ILogger
{
    public void Log(string message)
    {
        //空对象行为为空
    }
}

//真正的对象类，实现了ILogger接口
public class FileLogger : ILogger
{
    private readonly string _filename;

    public FileLogger(string fileName)
    {
        _filename = fileName;
    }

    public void Log(string message)
    {
        //将日志写入文件
        Console.WriteLine("写入日志");
    }
}